﻿using MediatR;
using Microsoft.AspNetCore.Mvc;
using Service.Core.Files;
using Service.Framework;

namespace Service.Auth.Api.Controller
{


    /// <summary>
    /// 文件存储控制器
    /// </summary>
    public class FileController(IMediator mediator, IFileManager fileManager)
        : BaseController(mediator)
    {

        /// <summary>
        /// 上传图片
        /// </summary>
        /// <param name="file"></param>
        /// <param name="folder"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<string> UploadFile(IFormFile file,string folder)
        {
            var maxLength = "50KB";
            var result = string.Empty;
            await fileManager.AddSaveFolder(folder)          // 设置保存文件位置为 wwwroot目录下 配置文件配置路径下 图片路径
                   .ResetFileExtensions()               // 清空已允许的上传格式
                   .AddFileExtensions(".png", ".jpg")   // 追加允许的上传格式
                   .AddMaxLength(maxLength)                 // 配置允许的上传大小
                   .BuildFileManagerContext()           // 构建上传上下文
                   .FileUploadAsync(file)               // 上传文件
                   .Success(info =>
                   {
                       result = info.FileRoot;
                   })
                   .Exists(info =>
                   {
                       result = info.FileRoot;
                   })
                   .Error(info =>
                   {
                       if (info.State == FileContextStates.MaxLimit)
                       {
                           throw new LogicErrorException($"文件长度超限，最大长度为：{maxLength}");
                       }
                       else if (info.State == FileContextStates.NoneExtensions)
                       {
                           throw new LogicErrorException("不支持的文件类型");
                       }
                       else if (info.State == FileContextStates.NoneFile)
                       {
                           throw new LogicErrorException("上传文件为空");
                       }
                       else
                       {
                           throw new LogicErrorException(info.Exception.Message);
                       }
                   });

            return result;
        }
    }
}
